home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 November: Tool Chest / Dev.CD Nov 00 TC Disk 1.toast / Sample Code / Contributed / SpriteWorld / SpriteWorld Files / BlitPixie / Sources / BlitPixieMaskCollision.c < prev    next >
Encoding:
Text File  |  2000-10-06  |  4.0 KB  |  222 lines  |  [TEXT/CWIE]

  1. ///--------------------------------------------------------------------------------------
  2. //    BlitPixieMaskCollision - pixel-precise collision detection
  3. //
  4. //    written by Anders F Björklund <afb@algonet.se>
  5. //    ©1999 afb.
  6. ///--------------------------------------------------------------------------------------
  7.  
  8. #ifndef __BLITPIXIE__
  9. #include "BlitPixieHeader.h"
  10. #endif
  11.  
  12. #include "BlitPixieAsm.h"
  13.  
  14. //    NOTE:    assumes bytes, rows > 0
  15.  
  16. #pragma mark *** PowerPC asm :
  17. #if USE_PPC_ASSEMBLY
  18.  
  19. ASM_FUNC Boolean BlitPixieMaskCollision(
  20.     register unsigned char *maskPtr1,        // r3
  21.     register unsigned char *maskPtr2,        // r4
  22.     register unsigned long rowBytes1,        // r5
  23.     register unsigned long rowBytes2,        // r6
  24.     register unsigned short bytes,            // r7
  25.     register unsigned short rows)            // r8
  26. {
  27. #define    r_maskPtr1        r3
  28. #define    r_maskPtr2        r4
  29. #define    r_rowBytes1        r5
  30. #define    r_rowBytes2        r6
  31. #define    r_bytes            r7
  32. #define    r_rows            r8
  33.  
  34. #define    r_dochar        r7
  35. #define    r_words            r9
  36. #define    r_doshort        r10
  37. #define    r_temp1            r11
  38. #define    r_temp2            r12
  39.  
  40.     ASM_BEGIN
  41.     
  42.     sub            r_rowBytes1,r_rowBytes1,r_bytes
  43.     sub            r_rowBytes2,r_rowBytes2,r_bytes
  44.  
  45.     rlwinm        r_words,r_bytes,30,2,31
  46.     rlwinm        r_doshort,r_bytes,31,31,31
  47.     rlwinm        r_dochar,r_bytes,0,31,31
  48.  
  49.     subi        r3,r3,4
  50.     subi        r4,r4,4
  51.  
  52.     cmplwi        cr5,r_words,0
  53.     cmplwi        cr6,r_doshort,0
  54.     cmplwi        cr7,r_dochar,0
  55.  
  56. @yloop:
  57.  
  58.      beq              cr5,@skipwords
  59.     mtctr        r_words
  60. @wordloop:
  61.     lwzu        r_temp1,4(r3)
  62.     lwzu        r_temp2,4(r4)
  63.     nor.        r_temp1,r_temp1,r_temp2
  64.     bne            @collision
  65.     bdnz        @wordloop
  66. @skipwords:
  67.  
  68.       beq              cr6,@skipshort
  69.     lhz            r_temp1,4(r3)
  70.     lhz            r_temp2,4(r4)
  71.     addi        r3,r3,2
  72.     or            r_temp1,r_temp1,r_temp2
  73.     cmplwi        r_temp1,0xFFFF
  74.     addi        r4,r4,2
  75.     bne            @collision
  76.  @skipshort:
  77.  
  78.       beq              cr7,@skipbyte
  79.     lbz            r_temp1,4(r3)
  80.     lbz            r_temp2,4(r4)
  81.     addi        r3,r3,1
  82.     or.            r_temp1,r_temp1,r_temp2
  83.     addi        r4,r4,1
  84.     beq            @collision
  85.  @skipbyte:
  86.  
  87.     subic.        r_rows,r_rows,1
  88.  
  89.     add            r3,r3,r_rowBytes1
  90.     add            r4,r4,r_rowBytes2
  91.  
  92.     bne            @yloop
  93.  
  94.     li            r3,0
  95.     blr
  96.  
  97. @collision:
  98.     li            r3,1
  99.     
  100.     ASM_END
  101. }
  102.  
  103. #pragma mark *** 680x0 asm :
  104. #elif USE_68K_ASSEMBLY
  105.  
  106. ASM_FUNC Boolean BlitPixieMaskCollision(
  107.     unsigned char *maskPtr1,    
  108.     unsigned char *maskPtr2,        
  109.     unsigned long rowBytesOffset1,
  110.     unsigned long rowBytesOffset2,
  111.     unsigned short bytesPerRow,
  112.     unsigned short rows)    
  113. {
  114.     #define D_rowBytes1        D2
  115.     #define D_rowBytes2        D3
  116.     #define D_bytes            D4
  117.     #define D_y                D5
  118.  
  119.     #define D_words            D6
  120.     #define D_doshort        D7
  121.  
  122.     ASM_BEGIN
  123.  
  124.     MOVEM.L      D3-D7/A2,-(SP)        // D0-D2,A0-A1 are volatile
  125.  
  126.     MOVEM.L      maskPtr1,A0/A1
  127. //        MOVE.L    maskPtr1,A0
  128. //        MOVE.L    maskPtr2,A1
  129.     MOVEM.L      rowBytesOffset1,D2-D3
  130. //        MOVE.L    rowBytes1,rowBytes1
  131. //        MOVE.L    rowBytes2,rowBytes2
  132.     MOVEM.W      bytesPerRow,D4-D5
  133. //        MOVE.W    bytesPerRow,bytes
  134. //        MOVE.W    rows,y
  135.  
  136.     SUB.L      D_bytes,D_rowBytes1
  137.     SUB.L      D_bytes,D_rowBytes2
  138.     
  139.     MOVE.W    D_bytes,D_words
  140.     LSR.W       #2,D_words
  141.     MOVE.W    D_bytes,D_doshort
  142.     ANDI.W      #2,D_doshort
  143.      ANDI.W      #1,D_bytes
  144.          
  145. @yloop:
  146.  
  147.     MOVE.W      D_words,D1
  148.      BEQ.S      @skipwords
  149. @wordloop:
  150.      MOVE.L    (A0)+,D0
  151.      OR.L      (A1)+,D0
  152.      NOT.L      D0
  153.      BNE.S      @collision
  154.      SUBQ.W    #1,D1
  155.     BNE.S     @wordloop
  156. @skipwords:
  157.  
  158.      TST.W      D_doshort
  159.      BEQ.S      @skipshort
  160.      MOVE.W    (A0)+,D0
  161.      OR.W      (A1)+,D0
  162.      NOT.W      D0
  163.     BNE.S      @collision
  164.   @skipshort:
  165.  
  166.      TST.W      D_bytes
  167.      BEQ.S      @skipbyte
  168.      MOVE.B    (A0)+,D0
  169.      OR.B      (A1)+,D0
  170.     BEQ.S      @collision
  171.   @skipbyte:
  172.  
  173.     ADDA.L      D_rowBytes1,A0
  174.     ADDA.L      D_rowBytes2,A1
  175.  
  176.       SUBQ.W    #1,D_y
  177.     BNE.S     @yloop
  178.  
  179.       MOVEQ      #0,D0
  180.       BRA.S      @done
  181.  
  182. @collision:
  183.      MOVEQ      #1,D0
  184.  
  185.  @done:
  186.      MOVEM.L      (SP)+,D3-D7/A2
  187.     ASM_END
  188. }
  189.  
  190. #pragma mark *** Generic C :
  191. #elif USE_GENERIC_C
  192.  
  193. Boolean BlitPixieMaskCollision(
  194.     unsigned char *maskPtr1,    
  195.     unsigned char *maskPtr2,    
  196.     unsigned long rowBytes1,
  197.     unsigned long rowBytes2,
  198.     unsigned short bytes,
  199.     unsigned short rows)
  200. {
  201.     unsigned long    x;
  202.     
  203.     rowBytes1 -= bytes;
  204.     rowBytes2 -= bytes;
  205.     
  206.     while ( rows-- )
  207.     {
  208.         for ( x = 0; x < bytes; x++)
  209.         {
  210.             if ( (*maskPtr1++ | *maskPtr2++) == 0 )
  211.                 return true;
  212.         }
  213.  
  214.         maskPtr1 += rowBytes1;
  215.         maskPtr2 += rowBytes2;
  216.     }
  217.     
  218.     return false;
  219. }
  220.  
  221. #endif // GENERATING…
  222.